{
 "cells": [
  {
   "cell_type": "code",
<<<<<<< HEAD
   "execution_count": 17,
=======
   "execution_count": 1,
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from tqdm import tqdm\n",
    "import csv\n",
    "import os\n",
    "import torch\n",
    "from torch.utils.data import Dataset\n",
    "import pickle\n",
    "from joblib import Parallel, delayed\n",
    "import random\n",
    "import datetime\n",
    "import operator\n",
    "from math import radians, cos, sin, asin, sqrt, floor, ceil\n",
    "from sklearn.model_selection import train_test_split\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
<<<<<<< HEAD
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "port_info_path = '../../data/DataForModelB/port_info_dict_dump.file'\n",
    "\n",
    "train_data_by_order_path_folder = '../../data/DataForModelB/data_for_correct_test_onBoardDate/train_data_by_order'\n",
    "washed_train_order_brief_path = '../../data/DataForModelB/data_for_correct_test_onBoardDate/washed_train_order_brief.csv'\n",
    "model_for_correct_test_data_path = '../../data/DataForModelB/data_for_correct_test_onBoardDate/model_for_correct_test_data.pkl'"
=======
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "port_info_path = '../data/DataForModelB/port_info_dict_dump.file'\n",
    "\n",
    "train_data_by_order_path_folder = '../data/DataForModelB/data_for_correct_test_onBoardDate/train_data_by_order'\n",
    "washed_train_order_brief_path = '../data/DataForModelB/data_for_correct_test_onBoardDate/washed_train_order_brief.csv'\n",
    "model_for_correct_test_data_path = '../data/DataForModelB/data_for_correct_test_onBoardDate/model_for_correct_test_data.pkl'"
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
   ]
  },
  {
   "cell_type": "code",
<<<<<<< HEAD
   "execution_count": 19,
=======
   "execution_count": 3,
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
   "metadata": {},
   "outputs": [],
   "source": [
    "washed_train_order_brief = pd.read_csv(washed_train_order_brief_path)\n",
    "with open(port_info_path, \"rb\") as f:\n",
    "    port_data = pickle.load(f)\n",
    "\n",
    "# 将 GPS 时间单位转换为小时\n",
    "washed_train_order_brief['onboardDate'] = pd.to_datetime(washed_train_order_brief['onboardDate'], infer_datetime_format=True)\n",
    "base_dt = pd.to_datetime('1970/01/01 00:00:00Z')\n",
    "washed_train_order_brief['onboardDate'] = (washed_train_order_brief['onboardDate'] - base_dt).dt.total_seconds() / 3600"
   ]
  },
  {
   "cell_type": "code",
<<<<<<< HEAD
   "execution_count": 39,
=======
   "execution_count": 4,
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
<<<<<<< HEAD
      "100%|██████████| 12098/12098 [02:50<00:00, 70.93it/s] "
=======
      "100%|██████████| 453/453 [00:09<00:00, 47.69it/s]\n"
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
<<<<<<< HEAD
      "Train shape: torch.Size([9678, 8])\n",
      "Validtaion shape: torch.Size([2420, 8])\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
=======
      "Train shape: torch.Size([362, 8])\n",
      "Validtaion shape: torch.Size([91, 8])\n"
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
     ]
    }
   ],
   "source": [
    "def haversine(lon1, lat1, lon2, lat2): # 经度1，纬度1，经度2，纬度2 （十进制度数）\n",
    "    # 将十进制度数转化为弧度\n",
    "    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])\n",
    "    # haversine公式\n",
    "    dlon = lon2 - lon1 \n",
    "    dlat = lat2 - lat1 \n",
    "    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2\n",
    "    c = 2 * asin(sqrt(a)) \n",
    "    r = 6371 # 地球平均半径，单位为公里\n",
    "    return c * r\n",
    "def _handle_single_order_for_ModelForCorrect(loadingOrder):\n",
    "    # 获取 gps 数据并且截取 10%~50%\n",
    "    order_data_path = os.path.join(train_data_by_order_path_folder, \"{}_gps_data.csv\".format(loadingOrder))\n",
    "    order_gps = pd.read_csv(order_data_path, header=None,\n",
<<<<<<< HEAD
    "                                         names=['timestamp','longitude','latitude','speed'] )   \n",
=======
    "                                         names=['loadingOrder','timestamp','longitude','latitude','speed'] )   \n",
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
    "    order_gps['timestamp'] = pd.to_datetime(order_gps['timestamp'], infer_datetime_format=True)\n",
    "    order_gps['timestamp'] = (order_gps['timestamp'] - base_dt).dt.total_seconds() / 3600\n",
    "    order_gps_len = order_gps.shape[0]\n",
    "    total_ratio = random.uniform(0.1, 0.5)\n",
    "    start_ratio = random.uniform(0, 0.3)\n",
    "    order_gps = order_gps[floor(order_gps_len*start_ratio) : ceil(order_gps_len*(start_ratio+total_ratio))].reset_index(drop=True)\n",
    "    # 获取特征\n",
    "    speed_median = order_gps['speed'].median()\n",
    "    speed_mean = order_gps['speed'].mean()\n",
    "    speed_max_index, speed_max = max(enumerate(order_gps['speed']), key=operator.itemgetter(1))\n",
    "    speed_min_index, speed_min = min(enumerate(order_gps['speed']), key=operator.itemgetter(1))\n",
    "    if speed_max_index == speed_min_index:\n",
    "        acceleration = 0\n",
    "    else:\n",
    "        acceleration = (speed_max - speed_min) / abs(order_gps.loc[speed_max_index, 'timestamp'] - order_gps.loc[speed_min_index, 'timestamp'])\n",
    "    # 获取港口信息、第一个时间戳位置距离起航港口距离\n",
    "    order_brief = washed_train_order_brief[washed_train_order_brief['loadingOrder'] == loadingOrder].reset_index(drop=True)\n",
    "    TRANSPORT_TRACE = order_brief.loc[0, 'TRANSPORT_TRACE']\n",
    "    order_ports = TRANSPORT_TRACE.split(\"-\")\n",
    "    start_port = order_ports[0]\n",
    "    start_port_lon, start_port_lat = port_data[start_port]['LON'], port_data[start_port]['LAT']\n",
    "    distance = haversine(start_port_lon, start_port_lat, order_gps.loc[0, 'longitude'], order_gps.loc[0, 'latitude'])\n",
    "    # 货运公司ID\n",
    "    carrierName = order_brief.loc[0, 'carrierName']\n",
    "    # 需要修正的时间\n",
    "    label_y = order_gps.loc[0, 'timestamp'] - order_brief.loc[0, 'onboardDate']\n",
    "    return start_port_lon, start_port_lat, distance, carrierName, speed_median, speed_mean, speed_max, acceleration, label_y\n",
    "#     return start_port_lon, start_port_lat, distance, speed_median, speed_mean, speed_max, acceleration, label_y\n",
    "\n",
    "order_list = washed_train_order_brief['loadingOrder'].values\n",
    "\n",
    "# 截取每个订单的一部分路由\n",
    "# 【并行处理】，当作训练数据\n",
    "# train_x_origin = Parallel(n_jobs=8)(delayed(_handle_single_order_for_ModelForCorrect)\n",
    "#                                 (order)\n",
    "#                                 for order in tqdm(order_list))\n",
    "\n",
    "train_data = []\n",
    "for order in tqdm(order_list):\n",
    "    train_data.append(_handle_single_order_for_ModelForCorrect(order))\n",
    "\n",
    "train_data = pd.DataFrame(train_data, columns=['start_port_lon','start_port_lat','distance','carrierName', 'speed_median', 'speed_mean', 'speed_max', 'acceleration', 'label_y'])\n",
    "# train_data = pd.DataFrame(train_data, columns=['start_port_lon','start_port_lat','distance', 'speed_median', 'speed_mean', 'speed_max', 'acceleration', 'label_y'])\n",
    "features = [item for item in train_data.columns if item != 'label_y']\n",
    "\n",
    "# train validation 划分\n",
    "X_train, X_val, Y_train, Y_val = train_test_split(train_data[features], train_data['label_y'], test_size=0.2, random_state=1125)\n",
    "\n",
    "X_train, Y_train = torch.tensor(X_train.values).float(), torch.tensor(Y_train.values).float()\n",
    "X_val, Y_val = torch.tensor(X_val.values).float(), torch.tensor(Y_val.values).float()\n",
    "\n",
    "print(\"Train shape: {}\".format(X_train.shape))\n",
    "print(\"Validtaion shape: {}\".format(X_val.shape))"
   ]
  },
  {
   "cell_type": "code",
<<<<<<< HEAD
   "execution_count": 44,
=======
   "execution_count": 5,
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
   "metadata": {},
   "outputs": [],
   "source": [
    "LR = 0.001\n",
    "epochs = 3000\n",
    "loss_func=torch.nn.MSELoss()\n",
    "DROP_OUT_RATE = 0.5\n",
    "\n",
    "class ModelForCorrect(torch.nn.Module):\n",
    "    def __init__(self):\n",
    "        \"\"\"\n",
    "        In the constructor we instantiate two nn.Linear modules and assign them as\n",
    "        member variables.\n",
    "        \"\"\"\n",
    "        super(ModelForCorrect, self).__init__()\n",
    "        self.dnn = torch.nn.Sequential(\n",
    "            torch.nn.Linear(8,128),\n",
    "            torch.nn.Dropout(DROP_OUT_RATE),\n",
    "            torch.nn.LeakyReLU(),\n",
    "            torch.nn.Linear(128,64),\n",
    "            torch.nn.Dropout(DROP_OUT_RATE),\n",
    "            torch.nn.LeakyReLU(),\n",
    "            torch.nn.Linear(64,1),\n",
    "        )\n",
    "\n",
    "    def forward(self, x):\n",
    "        \"\"\"\n",
    "        In the forward function we accept a Tensor of input data and we must return\n",
    "        a Tensor of output data. We can use Modules defined in the constructor as\n",
    "        well as arbitrary operators on Tensors.\n",
    "        \"\"\"\n",
    "        out = self.dnn(x)\n",
    "        return(out)"
   ]
  },
  {
   "cell_type": "code",
<<<<<<< HEAD
   "execution_count": 45,
=======
   "execution_count": 6,
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
<<<<<<< HEAD
      "100%|██████████| 3000/3000 [01:44<00:00, 28.65it/s]\n"
=======
      "100%|██████████| 3000/3000 [00:11<00:00, 250.51it/s]\n"
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
     ]
    }
   ],
   "source": [
    "modelForCorrect = ModelForCorrect()\n",
    "optimizer = torch.optim.Adam(modelForCorrect.parameters(), lr=LR,weight_decay=5e-3)\n",
    "#Training in batches\n",
    "train_losses = []\n",
    "val_losses = []\n",
    "for step in tqdm(range(epochs)):    \n",
    "    modelForCorrect.train()\n",
    "    out = modelForCorrect(X_train).reshape(-1)                 # input x and predict based on x\n",
    "    cost = loss_func(out, Y_train) \n",
    "    optimizer.zero_grad()   # clear gradients for next train\n",
    "    cost.backward()         # backpropagation, compute gradients\n",
    "    optimizer.step()        # apply gradients \n",
    "    if step % 100 == 0:        \n",
    "        modelForCorrect.eval()\n",
    "        train_out = modelForCorrect(X_train).reshape(-1)\n",
    "        train_cost = loss_func(train_out, Y_train) \n",
    "        train_losses.append(train_cost.data)\n",
    "        val_out = modelForCorrect(X_val).reshape(-1)\n",
    "        val_cost = loss_func(val_out, Y_val) \n",
    "        val_losses.append(val_cost.data)"
   ]
  },
  {
   "cell_type": "code",
<<<<<<< HEAD
   "execution_count": 46,
=======
   "execution_count": 7,
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
   "metadata": {},
   "outputs": [
    {
     "data": {
<<<<<<< HEAD
      "image/png": "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\n",
=======
      "image/png": "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\n",
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
<<<<<<< HEAD
     "metadata": {},
=======
     "metadata": {
      "needs_background": "light"
     },
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Loss curve\n",
    "plt.plot(train_losses)\n",
    "plt.plot(val_losses)\n",
    "plt.title('Loss')\n",
    "plt.legend(['train', 'validation'])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
<<<<<<< HEAD
   "execution_count": 24,
=======
   "execution_count": 8,
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
<<<<<<< HEAD
      "/home/ma-user/anaconda3/envs/Pytorch-1.0.0/lib/python3.6/site-packages/torch/serialization.py:250: UserWarning: Couldn't retrieve source code for container of type ModelForCorrect. It won't be checked for correctness upon loading.\n",
=======
      "D:\\Program\\Anaconda\\envs\\AI\\lib\\site-packages\\torch\\serialization.py:360: UserWarning: Couldn't retrieve source code for container of type ModelForCorrect. It won't be checked for correctness upon loading.\n",
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
      "  \"type \" + obj.__name__ + \". It won't be checked \"\n"
     ]
    }
   ],
   "source": [
    "torch.save(modelForCorrect, model_for_correct_test_data_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
<<<<<<< HEAD
   "display_name": "Pytorch-1.0.0",
   "language": "python",
   "name": "pytorch-1.0.0"
=======
   "display_name": "Python 3.7.6 64-bit ('AI': conda)",
   "language": "python",
   "name": "python37664bitaiconda6859e03b37c34f0182c9bde8073269f7"
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
<<<<<<< HEAD
   "version": "3.6.4"
=======
   "version": "3.7.6"
>>>>>>> 081c522bdcef1cb40c539a5a14ec6d26a3b53059
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
